/**Class LocalUser 
 * @author Florent Maillard
 **/
package lo23.model;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import lo23.data.Crypt;




public class LocalUser extends User {
	private List<Group> listGroup;
	private String password;
	/**
	 * Premier constructeur de la classe. Creation d'un nouvel utilisateur et des deux classes de base
	 * @param input	Mot de passe
	 * @param login pseudo de l'utilisateur
	 */
	public LocalUser (String login, String input) {
		super(login); 
		this.listGroup = new ArrayList <Group> ();
		Group g1 = new Group("Tous");
		Group g2 = new Group("En attente");
		this.listGroup.add(g1);
		this.listGroup.add(g2);
		this.password = Crypt.md5(input);
	}	
	/**
	 * Second constructeur de la classe. Creation d'un nouvel utilisateur et importation d'une liste de Groupes
	 * à condition qu'elle possede les deux groupes de base "Tous" et "En attente"
	 * 
	 * @param input Mot de passe
	 * @param listGroup Possibilité d'importer une liste de groupe déjà existante
	 * @param login pseudo de l'utilisateur
	 */
	public LocalUser (String login, String input, List<Group> listGroup) {
		super(login);
		boolean p = false ,s = false;
		Iterator<Group> it = listGroup.iterator();
		while (it.hasNext()) {
			Group g = (Group) it.next();
			if (g.getName() == "Tous")
				p = true;
			else if (g.getName() == "En attente")
				s = true;
		} 
		if (p && s)
			this.listGroup = new ArrayList <Group> (listGroup);
		else 
			return;
		this.password = Crypt.md5(input);
	}
	/**
	 * Methode qui retourne le mot de passe de l'utilisateur
	 * @return La chaine de caractère representant le mot de passe
	 */
	public String getPassword () {
		return this.password;
	}
	/**
	 * Methode permettant de changer le mot de passe de l'utilisateur
	 * @param input Nouveau mot de passe
	 */
	public void SetPassword (String input) {
		this.password = Crypt.md5(input);
	}
	/**
	 * Methode permettant l ajout d'un nouveau groupe, sous condition qu'il n'existe pas déjà
	 * @param g Groupe a ajouter
	 */
	public void addGroup (Group g) {
		Iterator<Group> it = listGroup.iterator();
		while (it.hasNext()) {
			Group gr = (Group) it.next();
			if (gr.getName() == g.getName())
				return;
		} 
		this.listGroup.add(g);
	}
	/**
	 * Methode de suppression d'un groupe de contact
	 * @param name Le nom du groupe a supprimer
	 */
	public void deleteGroup (String name) {
		Group g1;
		Group g2;
		if (name == "Tous" || name == "En attente")
			return ; // On ne peut supprimer ces groupes
		else {
			g1 = getGroupByName("Tous");
			g2 = getGroupByName(name);
			List<Contact> cont = g2.getListContact();
			Iterator<Contact> it2 = cont.iterator();
			while (it2.hasNext()) {
				Contact c = (Contact) it2.next();
				g1.addContact (c);
			} 
		}
		listGroup.remove (g2);	
	}
	/**
	 * Methode permettant de connaitre tous les groupes d'un utilisateur
	 * @return liste des groupes
	 */
	public List<Group> getListGroup() {
		return this.listGroup;
	}
	/**
	 * 
	 * @param s
	 * @return
	 */
	public Group getGroupByName (String s) {
		Group gr = this.listGroup.get(0);
		Iterator<Group> it = listGroup.iterator();
		while (it.hasNext()) {
			gr = (Group) it.next();
			if (gr.getName() == s)
				break;
		}
		return gr;
	}
	/**
	 * Methode permattant de changer entierement tous les groupes du contact
	 * @param l liste de groupes
	 */
	public void setListGroup (List<Group> l) {
		this.listGroup = l;
	}
}